/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.medical.controlador.recepcion;

import com.ec.medical.controlador.ControladorBase;
import com.ec.medical.entidades.Cita;
import com.ec.medical.entidades.Prestador;
import com.ec.medical.enumeracion.ActInaEnum;
import com.ec.medical.enumeracion.EstadoCitaEnum;
import com.ec.medical.exepciones.CitaException;
import com.ec.medical.managers.recepcion.AgendarCitasDataManager;
import com.ec.medical.servicio.CitaServicioLocal;
import com.ec.medical.servicio.PrestadorServicioLocal;
import com.ec.medical.util.GenerarCitas;
import com.ec.medical.util.GenerarCitasParaRecepcion;
import com.ec.medical.util.Utilitarios;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.DefaultScheduleModel;
import org.primefaces.model.ScheduleEvent;

/**
 *
 * @author Administrador
 */
@ManagedBean
@RequestScoped
public class AgendarCitasControlador extends ControladorBase {

    private Logger LOG = Logger.getLogger(AgendarCitasControlador.class.getName());
    @ManagedProperty(value = "#{agendarCitasDataManager}")
    private AgendarCitasDataManager agendarCitasDataManager;
    @EJB
    private CitaServicioLocal citaServicio;
    @EJB
    private PrestadorServicioLocal prestadorServicio;

    /**
     * Creates a new instance of AgendarCitasControlador
     */
    public AgendarCitasControlador() {
    }

    @Override
    protected void imprimirLogInfo(String mensaje) {
        LOG.info(mensaje);
    }

    @Override
    protected void imprimirLogError(String mensaje) {
        LOG.error(mensaje);
    }

    @Override
    public void iniciarDatos() {
        imprimirLogInfo("..iniciarDatos");

        Prestador prestador = getAgendarCitasDataManager().getPrestador();

        if (!Utilitarios.esNulo(prestador) && !Utilitarios.esNulo(prestador.getCodigoPrestador())) {
            generarCitas();
        }

    }

    public void generarCitas() {

        if (Utilitarios.esNulo(getAgendarCitasDataManager().getPrestador()) || Utilitarios.esNulo(getAgendarCitasDataManager().getPrestador().getCodigoPrestador())) {
            getAgendarCitasDataManager().setScheduleModel(new DefaultScheduleModel());

        } else {
            getAgendarCitasDataManager().setScheduleModel(GenerarCitas.generarCitasTodosEstados(new GenerarCitasParaRecepcion(citaServicio, getAgendarCitasDataManager().getPrestador(), Utilitarios.sumarDiasAFecha(obtenerFechaActual(), -10))));
        }


    }

    public List<SelectItem> getPrestadores() {
        return generarItemsConValorNulo(prestadorServicio.obtenerTodosActivos(ActInaEnum.ACT));
    }

    public AgendarCitasDataManager getAgendarCitasDataManager() {
        return agendarCitasDataManager;
    }

    public void setAgendarCitasDataManager(AgendarCitasDataManager agendarCitasDataManager) {
        this.agendarCitasDataManager = agendarCitasDataManager;
    }

    public void seleccionEvento(SelectEvent selectEvent) {
        try {
            ScheduleEvent event = (ScheduleEvent) selectEvent.getObject();

            Integer codigoCita = Integer.parseInt(event.getId());
            Cita cita = citaServicio.obtenerCitaPorCodigo(new Cita(codigoCita));
            cita.setPuedeCancelarCita(cita.getEstado().equals(EstadoCitaEnum.ACT));
            getAgendarCitasDataManager().setCita(cita);
            getAgendarCitasDataManager().setDeshabilitarCancelarCita(false);
        } catch (Exception e) {
            errorMessage("Error al obtener datos de la cita");
        }
    }

    /**
     * metodo que crea una cita para cada mascota que esta siendo registrada
     *
     * @param selectEvent
     */
    public void seleccionarDiaParaCita(SelectEvent selectEvent) {
        Date fechaSeleccionada = (Date) selectEvent.getObject();
        imprimirLogInfo("fechaSeleccionada " + fechaSeleccionada);
        getAgendarCitasDataManager().setFechaSeleccionadaParaCita(fechaSeleccionada);

        if (Utilitarios.esNulo(getAgendarCitasDataManager().getPrestador()) || Utilitarios.esNulo(getAgendarCitasDataManager().getPrestador().getCodigoPrestador())) {
            getAgendarCitasDataManager().setIrACita(false);
            getAgendarCitasDataManager().setMensaje("Debe seleccionar un Medico ");
        } else if (fechaSeleccionada.after(obtenerFechaActual()) || fechaSeleccionada.equals(obtenerFechaActual())) {
            getAgendarCitasDataManager().setIrACita(true);
            getAgendarCitasDataManager().setMensaje("Desea Agendar una cita para el: " + getAgendarCitasDataManager().getFechaSeleccionadaParaCitaFormateada() + " ?");
        } else {
            getAgendarCitasDataManager().setIrACita(false);
            getAgendarCitasDataManager().setMensaje("No puede seleccionar una fecha anterior a la actual ");
        }
    }

    /**
     * MEtodo que realiza la cancelacion de una cita
     */
    public void cancelarCita() {
        try {
            getAgendarCitasDataManager().setCita(citaServicio.cancelarCita(getAgendarCitasDataManager().getCita()));
            getAgendarCitasDataManager().setDeshabilitarCancelarCita(true);
            infoMessage("Cita cancelada");
            generarCitas();
        } catch (CitaException ex) {
            errorMessage(ex.getMessage());
        }
    }
}
